Introducción

La mortalidad prenatal se refiere a aquellos bebés que fallecen pasadas las 28 semanas de embarazo (a partir del séptimo mes) y que no llegan a término. Las pricipales causas son las complicaciones que surgen durante el embarazo ya sean por infecciones como sífilis o VIH, otros tipos de anomalías maternas, como diabetes o hipertensión o hábitos perjudiciales como el consumo de tabaco o el alcohol.

Además de estos factores, las condiciones ambientales pueden tener un efecto negativo en el embarazo. Estudios sugieren que la presencia de contaminantes en el aire pueden causar complicaciones en el embarazo e incluso aumentar la probabilidad de partos prematuros, así como la exposición al ruido puede tener efectos adversos para el embarazo pudiendo llegar a afectar a la mortalidad prenatal.

En este seminario, vamos a tratar de demostrar si estos estudios se cumplen en las distintas comunidades autónomas españolas, analizando la relación que hay entre la calidad del aire y la contaminación acústica con la mortalidad prenatal.

Objetivos

El objetivo principal es demostrar si la contaminación del aire y la exposición al ruido pueden estar asociados con el número de casos de mortalidad fetal, a través de:

  • Analizar la concentración de PM 2.5 y PM 10 en el aire por comunidad autónoma.
  • Estudiar la relación entre la calidad del aire y mortalidad prenatal.
  • Analizar el porcentaje de población afectada por exceso de ruido en cada comunidad autónoma.
  • Estudiar la relación entre el exceso de ruido y mortalidad prenatal.

Metodología

Los datos que vamos a utilizar han sido encontrados en la página oficial del Instituto Nacional de Estadística (INE) en el que se pueden encontrar una gran cantidad de datos de diferentes formatos como XLS, csv, JSON … En nuestro caso los datos sobre mortalidad prenatal y contaminación son de fromato csv y JSON y se encuentran en la carpeta DATA dentro de la carpeta Input del repositorio.

Para poder utilizar estos conjuntos de datos son necesarios importarlos, para ello utilizaremos las siguientes librerías:

# Datos con formato .csv:
library(readr)

#Datos con formato .json:
library(tidyverse)
library(rjson)
library(tidyjson)

#Visualizacion resultados:
library(DT)
library(ggplot2)
library(gifski)
library(ggplot2)
library(gganimate)

Importación archivos

Una vez cargadas las librerías se pueden importar los datos.

Importación datos CSV:

En algunos de nuestros archivos csv, es necesario especificar el tipo de codificación que tienen, para que R pueda leer correctamente los caracteres especiales como tildes o ñ. En nuestro caso utilizan la codificacion ISO 8859-1 que corresponde con el alfabeto español :

# Para conocer el tipo de codificación: 
encoding <- guess_encoding("Input/DATA/media_anual_PM2_5.csv")
print(encoding)
## # A tibble: 2 × 2
##   encoding   confidence
##   <chr>           <dbl>
## 1 ISO-8859-1       0.58
## 2 ISO-8859-2       0.25
PM2_media <- read_delim("Input/DATA/media_anual_PM2_5.csv", 
                        delim = ";", escape_double = FALSE, trim_ws = TRUE, 
                        locale = locale(encoding = "ISO-8859-1"))

PM10_media <- read_delim("Input/DATA/media_anual_PM10.csv", 
                        delim = ";", escape_double = FALSE, trim_ws = TRUE, 
                        locale = locale(encoding = "ISO-8859-1"))

RUIDO_media <- read_delim("Input/DATA/poblacion_sufre_ruidos.csv", 
                         delim = ";", escape_double = FALSE, trim_ws = TRUE)

Preparación datos csv

Los datos en los archivos csv estan distribuidos de tal forma que puede dificultar su comprensión y manejo, por ello vamos a modificarlos y ordenarlos.

El objetivo es conseguir que los años (periodo), que de forma predeterminada vienen en una única columna pasen a ser las columnas del dataframe y el nombre de las comunidades autónomas las filas. Además, eliminar aquellas columnas y filas que no son de nuestro interés.

# Datos concentración anual PM 2.5
PM2_ccaa_media <- PM2_media %>%
  pivot_wider(names_from = periodo, values_from = Total)%>% 
  select(-`Total Nacional`)%>% #Eliminar columna Total Nacional
  slice(-1)%>%                    #Eliminar fila Total Nacional
  pivot_longer(
    cols = c("2022":"2004"),names_to = "Año",values_to = "PM2_5"
  )                    

datatable(PM2_ccaa_media)
# Datos concentración anual PM 10
PM10_CCAA_media <- PM10_media %>%
  pivot_wider(names_from = periodo, values_from = Total)%>%
  select(-`Total Nacional`)%>%
  slice(-1)%>%
  pivot_longer(names_to = "Año", values_to = "PM10", cols = c("2022":"2004"))

datatable(PM10_CCAA_media)
#Datos población afectada por ruidos
RUIDO_CCAA_media <- RUIDO_media %>%
  pivot_wider(names_from = periodo, values_from = Total)%>%
  select(-`Total Nacional`)%>%
  slice(-1) %>%
  pivot_longer(names_to = "Año", values_to = "Ruido", cols = c("2020":"2004"))

El nombre de las Comunidades Autónomas en los archivos csv aparecen con un índice que en nuestro caso vamos a eliminar ya que no lo utilizaremos y nos dificulta el tratamiento de las tablas.

(En las tablas referentes a contaminación, se cambiará más adelante)

En el caso del ruido:

RUIDO_CCAA <- 
  RUIDO_CCAA_media %>%
  mutate(Comunidades_Autonomas = case_when(
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "01 Andalucía" ~ "Andalucía",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "02 Aragón" ~ "Aragón",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "03 Asturias, Principado de" ~ "Asturias, Principado de",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "04 Balears, Illes" ~ "Balears, Illes",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "05 Canarias" ~ "Canarias",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "06 Cantabria" ~ "Cantabria",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "07 Castilla y León" ~ "Castilla y León",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "08 Castilla - La Mancha" ~ "Castilla - La Mancha",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "09 Cataluña" ~ "Cataluña",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "10 Comunitat Valenciana" ~ "Comunitat Valenciana",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "11 Extremadura" ~ "Extremadura",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "12 Galicia" ~ "Galicia",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "13 Madrid, Comunidad de" ~ "Madrid, Comunidad de",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "14 Murcia, Región de" ~ "Murcia, Región de",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "15 Navarra, Comunidad Foral de" ~ "Navarra, Comunidad Foral de",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "16 País Vasco" ~ "País Vasco",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "17 Rioja, La" ~ "Rioja, La",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "18 Ceuta" ~ "Ceuta",
    RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "19 Melilla" ~ "Melilla",
    ))%>%
  select(Comunidades_Autonomas, everything())%>%
  select(-`Comunidades y Ciudades Autónomas`)

datatable(RUIDO_CCAA)

Importación datos JSON:

mort_prenatal <- fromJSON(file = "INPUT/DATA/mortalidad_prenatal_total.json")

mort_prenatal %>% 
  spread_all()
## # A tbl_json: 60 x 6 tibble with a "JSON" attribute
##    ..JSON                  document.id COD      Nombre       T3_Unidad T3_Escala
##    <chr>                         <int> <chr>    <chr>        <chr>     <chr>    
##  1 "{\"COD\":\"IDB8311..."           1 IDB83113 Total Nacio… Defuncio… " "      
##  2 "{\"COD\":\"IDB8311..."           2 IDB83112 Total Nacio… Defuncio… " "      
##  3 "{\"COD\":\"IDB8311..."           3 IDB83111 Total Nacio… Defuncio… " "      
##  4 "{\"COD\":\"IDB8317..."           4 IDB83170 Andalucía, … Defuncio… " "      
##  5 "{\"COD\":\"IDB8316..."           5 IDB83169 Andalucía, … Defuncio… " "      
##  6 "{\"COD\":\"IDB8316..."           6 IDB83168 Andalucía, … Defuncio… " "      
##  7 "{\"COD\":\"IDB8316..."           7 IDB83167 Aragón, Mor… Defuncio… " "      
##  8 "{\"COD\":\"IDB8316..."           8 IDB83166 Aragón, Mor… Defuncio… " "      
##  9 "{\"COD\":\"IDB8316..."           9 IDB83165 Aragón, Mor… Defuncio… " "      
## 10 "{\"COD\":\"IDB8316..."          10 IDB83164 Asturias, P… Defuncio… " "      
## # ℹ 50 more rows

Preparación archivos .json

Una vez que hemos importado el archivo json, analizamos los tipos de los atributos que lo forman para quedarnos con aquellos de tipo array que son los que contienen la información que queremos:

mort_prenatal %>% 
  gather_object %>% 
  json_types %>% 
  count(name, type)
## # A tibble: 6 × 3
##   name      type       n
##   <chr>     <fct>  <int>
## 1 COD       string    60
## 2 Data      array     60
## 3 MetaData  array     60
## 4 Nombre    string    60
## 5 T3_Escala string    60
## 6 T3_Unidad string    60

En nuestro caso queremos estudiar la mortalidad prenatal tanto en hombres como en mujeres, para ello filtramos eliminando las columnas de hombres y mujeres quedándonos con las de ambos sexos:

filter <- c()
for (i in 1:60){
  filter <- append(filter, mort_prenatal[[i]]$MetaData[[4]]$Nombre == "Ambos sexos")
}
elim = 0
for (i in 1:60){
  if(!filter[i]){
    mort_prenatal[[i-elim]] <- NULL
    elim <- elim + 1
  }
}

Analizamos en profundidad el contenido de cada array y obtenemos lo siguiente:

  • Array Data: se encuentran los valores de todos los años y sus respectivos valores de tasa de mortalidad prenatal
#VALORES DE LOS AÑOS A PARTIR DE 2004 Y VALORES MORTALIDAD
mort_valores_prenatal <-
  mort_prenatal %>%
  enter_object(Data) %>%
  gather_array %>%
  spread_all %>%
  select(Anyo, Valor, document.id)%>% 
  filter(Anyo >=2004)
  • Array Metadata: están los nombres de las comunidades autónomas y clasficación por sexos
mort2_CCAA_prenatal <- mort_prenatal %>%
  enter_object(MetaData) %>%
  gather_array %>%
  spread_all %>%
  select(Nombre, document.id, T3_Variable) %>%
  filter(Nombre == "Andalucía" | Nombre == "Aragón" | Nombre == "Asturias, Principado de" |
           Nombre == "Balears, Illes" | Nombre == "Canarias" | Nombre == "Cantabria" |
           Nombre == "Castilla y León" | Nombre == "Castilla - La Mancha" | Nombre == "Cataluña" |
           Nombre == "Comunitat Valenciana" | Nombre == "Extremadura" | Nombre == "Galicia" |
           Nombre == "Madrid, Comunidad de" | Nombre == "Murcia, Región de" | Nombre == "Navarra, Comunidad Foral de" |
           Nombre == "País Vasco" | Nombre == "Rioja, La" | Nombre == "Ceuta" | Nombre == "Melilla") 

Para obtener la tabla con todos los datos bien estructurados y organizados es necesario hacer join entre los datos de ambos arrays:

#Join:
JOIN_mort_prenatal <-
  mort_valores_prenatal %>% 
  select(c("Anyo", "Valor", "document.id")) %>%
  full_join(x = ., 
            y = mort2_CCAA_prenatal %>% 
              select(c("Nombre", "document.id")),
            by = c("document.id") )
mortalidad <- JOIN_mort_prenatal %>%
  select(Nombre, Anyo, Valor)%>%
  pivot_wider(names_from = Anyo, values_from = Valor)%>% #Hacer que filas = CCAA y columnas = años
  slice(-1)%>%#Eliminar datos Total Nacional
  pivot_longer(names_to = "Año", values_to = "Mortalidad", cols = c("2022":"2004"))%>%
  rename(Comunidades_Autonomas = "Nombre")
  
datatable(mortalidad)

Concentración contaminantes en el aire por CCAA

A continuación relacionaremos las dos tablas de contaminación, obteniendo un valor medio entre estas PM2.5 y PM10, para posteriormente hacer una unión con la mortalidad.

# Limpiar los datos, eliminando valores no numéricos o incorrectos
# Reemplazar comas por puntos decimales y convertir a numérico

PM2_ccaa_media <- PM2_ccaa_media %>%
  mutate(PM2_5 = as.numeric(gsub(",", ".", as.character(PM2_5))))

PM10_CCAA_media <- PM10_CCAA_media %>%
  mutate(PM10 = as.numeric(gsub(",", ".", as.character(PM10))))



# Unir las tablas por "Comunidades y Ciudades Autónomas" y "año"
calidad_aire <- PM2_ccaa_media %>%
  inner_join(PM10_CCAA_media, by = c("Comunidades y Ciudades Autónomas", "Año"))

# Calcular la media para cada comunidad y año, ignorando los valores NA
tabla_aire <- calidad_aire %>%
  mutate(media_PM = rowMeans(select(., PM2_5, PM10), na.rm = TRUE)) %>% # Calcular media entre PM2.5 y PM10
  group_by(`Comunidades y Ciudades Autónomas`, Año) %>%
  summarize(media_PM = mean(media_PM, na.rm = TRUE), .groups = "drop") # Media por grupo ignorando NA

Cambio de nombre de atributo Comunidades y Ciudades Autónomas

media_calidad_aire <- 
  tabla_aire %>%
  mutate(Comunidades_Autonomas = case_when(
    tabla_aire$`Comunidades y Ciudades Autónomas`== "01 Andalucía" ~ "Andalucía",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "02 Aragón" ~ "Aragón",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "03 Asturias, Principado de" ~ "Asturias, Principado de",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "04 Balears, Illes" ~ "Balears, Illes",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "05 Canarias" ~ "Canarias",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "06 Cantabria" ~ "Cantabria",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "07 Castilla y León" ~ "Castilla y León",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "08 Castilla - La Mancha" ~ "Castilla - La Mancha",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "09 Cataluña" ~ "Cataluña",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "10 Comunitat Valenciana" ~ "Comunitat Valenciana",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "11 Extremadura" ~ "Extremadura",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "12 Galicia" ~ "Galicia",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "13 Madrid, Comunidad de" ~ "Madrid, Comunidad de",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "14 Murcia, Región de" ~ "Murcia, Región de",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "15 Navarra, Comunidad Foral de" ~ "Navarra, Comunidad Foral de",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "16 País Vasco" ~ "País Vasco",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "17 Rioja, La" ~ "Rioja, La",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "18 Ceuta" ~ "Ceuta",
    tabla_aire$`Comunidades y Ciudades Autónomas`== "19 Melilla" ~ "Melilla",
    ))%>%
  select(Comunidades_Autonomas, everything())%>%
  select(-`Comunidades y Ciudades Autónomas`)
  

# Ver los resultados de la media
datatable(media_calidad_aire)

Podemos visualizar la evolución de la concentración de particulas en el aire:

Relación contaminación - mortalidad prenatal

Ahora relacionaremos la tabla anterior con la mortalidad prental.

mortalidad_aire <-
  full_join(x = media_calidad_aire, y = mortalidad, by = c("Comunidades_Autonomas", "Año"))
  
            
datatable(mortalidad_aire)

Una vez obtenida la tabla con los datos de concentración media de PM y de mortalidad prenatal por año y comunidad autónomas podemos ver si existe alguna relación.

#### Conclusiones:

Población afectada por ruido

# Suponiendo que tienes un dataframe 'datos' con las columnas 'Comunidad_Autonoma', 'Año' y 'Ruido'
ggplot(RUIDO_CCAA, aes(x = factor(Año), y = Ruido, fill = Comunidades_Autonomas)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Evolución del Ruido por Comunidad Autónoma",
    x = "Año",
    y = "Valor de Ruido"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")

ggplot(RUIDO_CCAA, aes(x = Año, y = Ruido, color = Comunidades_Autonomas)) +
  geom_point() +
  labs(title = "Ruido por Comunidad Autónoma y Año", 
       x = "Año", 
       y = "Valor de Ruido") +
  theme_minimal() +
  theme(legend.position = "bottom")

Relación entre contaminación acústica - mortalidad prenatal

A continuación haremos lo mismo pero en este caso, uniendo la tabla de mortalidad prenatal junto con la de ruido ambiente.

mortalidad_RUIDO <- 
  full_join(x = RUIDO_CCAA, y = mortalidad, by = c("Comunidades_Autonomas", "Año"))
            
datatable(mortalidad_RUIDO)

Representar resultados

Representaremos unas gráficas en las que se vea la evolución de la muerte prenatal en función de las dos variables planteadas; Ruido y Media_PM.

# Verificar si hay datos para la comunidad seleccionada
cat("Comunidades autónomas disponibles:\n")
## Comunidades autónomas disponibles:
print(unique(mortalidad_aire$"Comunidades Autonomas"))  # Lista las comunidades únicas
## Warning: Unknown or uninitialised column: `Comunidades Autonomas`.
## NULL
# Pedir al usuario que introduzca una comunidad autónoma
comunidad_seleccionada <- readline(prompt = "Introduce la comunidad autónoma que deseas analizar: ")
## Introduce la comunidad autónoma que deseas analizar:
# Filtrar los datos para la comunidad seleccionada
datos_filtrados <- mortalidad_aire %>% 
  filter("Comunidades Autonomas" == comunidad_seleccionada)

# Filtrar los datos para la comunidad seleccionada
datos_filtrados <- subset(mortalidad_aire, "Comunidades Autonomas" == comunidad_seleccionada)

# Verificar si hay datos para la comunidad seleccionada
if (nrow(datos_filtrados) == 0) {
  cat("No hay datos disponibles para la comunidad autónoma seleccionada:", comunidad_seleccionada, "\n")
} else {
  # Crear la gráfica
  grafica <- ggplot(datos_filtrados, aes(x = año)) +
    geom_line(aes(y = media_PM, color = "Media PM2.5"), size = 1) +
    geom_line(aes(y = Mortalidad, color = "Mortalidad"), size = 1) +
    geom_point(aes(y = Mortalidad, color = "Mortalidad"), size = 2) +
    labs(
      title = paste("Evolución de Mortalidad y Contaminación en", comunidad_seleccionada),
      x = "Año",
      y = "Valores",
      color = "Indicador"
    ) +
    theme_minimal()

  # Mostrar la gráfica
  print(grafica)
}
## No hay datos disponibles para la comunidad autónoma seleccionada:

Idea primer objetivo: realizar un mapa en el que se vean los distintos datos usando los siguientes paquetes:

#library(mapSpain)
#library(sf)
#library(dplyr)
#library(ggplot2)